2012/08/09

Recent entries from same category

  1. 最近のjavaコンパイラはconstなStringを結合して最適化...しない
  2. 暇だったのでanarcy goldなんかしてみた。

gist に置いておくのも勿体ないかなと思ったので、こちらにも。
職業PGにわかるFizzBuzz - 日々常々

なんかFizzBuzzが書けないPGがどーとか定期的に話題になってるけど、私に言わせれば説明の仕方が悪い。

http://d.hatena.ne.jp/irof/20120808/p1
この設計書を参考に業務プログラマっぽくコードを書いてみた。
業務プログラマがFizzBuzz書いたらどうなるか ( ref: http://d.hatena.ne.jp/irof/20120808/p1 ) — Gist
https://gist.github.com/3292173
結構、設計書通りに作ったつもり。ループじゃなく、標準入力から読み込み、標準出力する部分も仕様通りです。
ただこの標準入出力を使っている事が裏目に出て、試験では標準入出力を一時的に差し替える必要があった。
試験コードだけ載せておく。
import org.junit.After;
import org.junit.Before;
import org.junit.Test;
import static org.junit.Assert.assertEquals;

import java.io.BufferedOutputStream;
import java.io.BufferedReader;
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.InputStream;
import java.io.IOException;
import java.io.PrintStream;
import java.io.StringReader;

import net.kaoriya.mattn.joke.FizzBuzz;

/**
 * FizzBuzzテストクラス.
 */
public class FizzBuzzTest {
    /** 標準入力退避用. */
    private InputStream in;

    /** 標準出力退避用. */
    private PrintStream out;

    /**
     * テスト開始前処理.
     *
     * <p>標準入力および標準出力を退避する</p>
     */
    @Before
    public void setUp() {
        in = System.in;
        out = System.out;
    }

    /**
     * テスト開始後処理.
     *
     * <p>標準入力および標準出力を復帰する</p>
     */
    @After
    public void tearDown() {
        System.setIn(in);
        System.setOut(out);
    }

    /**
     * テスト実行.
     *
     * <ul>
     * <li>標準出力を差し替える</li>
     * <li>標準入力を引数nを数値化した入力に差し替える</li>
     * <li>FizzBuzzクラスを生成する</li>
     * <li>FizzBuzz変換処理を実行する</li>
     * <li>標準出力された文字列と引数sで検証する</li>
     * </ul>
     *
     * @param n FizzBuzz変換処理に与える数値
     * @param s 期待する結果
     * @throws IOException 標準入出力処理に失敗した場合に発生
     */
    private void doFizzBuzz(int n, String s) throws IOException {
        ByteArrayOutputStream baos = new ByteArrayOutputStream();
        BufferedOutputStream bos = new BufferedOutputStream(baos);
        System.setOut(new PrintStream(bos));
        byte[] input = ("" + n + "\n").getBytes();
        System.setIn(new ByteArrayInputStream(input));

        FizzBuzz fb = new FizzBuzz();
        fb.runFizzBuzzConvert();

        System.out.flush();
        StringReader sr = new StringReader(baos.toString());
        String result = new BufferedReader(sr).readLine();
        assertEquals(s, result);
    }

    /**
     * FizzBuzz変換処理テスト.
     *
     * @throws IOException 標準入出力処理に失敗した場合に発生
     */
    @Test
    @SuppressWarnings
    public void testFizzBuzz() throws IOException {
        // CHECKSTYLE:OFF
        doFizzBuzz(1"1");
        doFizzBuzz(2"2");
        doFizzBuzz(3"Fizz");
        doFizzBuzz(4"4");
        doFizzBuzz(5"Buzz");
        doFizzBuzz(6"Fizz");
        doFizzBuzz(7"7");
        doFizzBuzz(8"8");
        doFizzBuzz(9"Fizz");
        doFizzBuzz(10"Buzz");
        doFizzBuzz(11"11");
        doFizzBuzz(12"Fizz");
        doFizzBuzz(13"13");
        doFizzBuzz(14"14");
        doFizzBuzz(15"FizzBuzz");
        doFizzBuzz(16"16");
        // CHECKSTYLE:ON
    }
}
一応、プロジェクトフォルダになっているので # git clone git://gist.github.com/3292173.git として貰ったら開発出来る様にしてある。gradle を使っているので # gradle build でビルド # gradle test でテスト。javadoc は # gradle javadoc でどうぞ。
ネタなのでツッコミなしでお願いします。ましてやバグチケット切るなど問題外です。
Posted at by